iT邦幫忙

1

🛠️從改了卻沒套用,到一鍵部署:我修好了 ASP.NET Web Site 專案的 DLL 同步問題

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20250704/20155103Hz3F5Vn31H.png

🤯 改了程式卻沒反應?我遇到的「DLL 沒更新陷阱」

某天我修改了 Portal\AccountUser.cs,但無論怎麼刷新網站、重啟 IIS,功能還是老樣子。我原本以為是 Cache、是記憶體殘留,甚至懷疑是不是寫錯邏輯,但真相其實是:

我改的是 DLL 的原始碼,但 Web 專案吃的是舊的 DLL。

🪤 原因層層追查下來,是這樣的:

問題點 說明
專案引用的是 DLL 路徑(非專案參考) 無法自動同步 DLL 版本
Web Site 專案沒有 .csproj 沒辦法控制 OutputPath 與參考依賴
建置 DLL 只是「建出來」,不代表會「複製到 bin」 導致網站實際執行仍吃舊 DLL

🧠 搞懂「方案」與「專案」的真相

概念 定義 我當時的情境
Solution 整包 VS 專案,副檔名 .sln kgeip.sln
Project 功能單位,會編成 DLL/EXE,副檔名 .csproj Portal、Component 有,kgeip 沒有(Web Site 專案)

🔁 將 DLL 引用改為專案參考:我做了什麼?

在進行 DLL 同步優化之前,我的 kgeip Web Site 專案中引用了 Portal.dllComponent.dll,都是以 BIN 類型的 DLL 引用(齒輪圖示)方式加入

為了讓 Visual Studio 能自動同步 DLL,我改採「專案參考」模式(方塊圖示),流程如下:

  1. 在 kgeip 專案的「參考」視窗中,先選取原有的 DLL 參考,點「移除」
  2. 點「加入」→「專案」→ 勾選 ComponentPortal
  3. 點「確定」

https://ithelp.ithome.com.tw/upload/images/20250704/2015510382wCDdMEw6.png

這樣一來,Visual Studio 就會:

  • 在建置 kgeip 時自動建置這兩個專案
  • 自動複製產出的 DLL 到 kgeip\bin
  • F12 可跳到原始碼
  • 保證 DLL 為最新版本

🆚 Web Site 與 Web Application 的差異

在處理 DLL 同步問題時,理解這兩種 Visual Studio 專案型別的差別非常重要:

項目 Web Site 專案 Web Application 專案
是否有 .csproj 檔案 ❌ 沒有 ✅ 有
編譯方式 執行時動態編譯 建置時預編譯為 DLL
頁面語法 使用 CodeFile 使用 CodeBehind
F12 導航 可能只能跳 metadata 可直接跳至原始碼
DLL 處理方式 需手動複製到 bin 專案參考自動同步
適合用途 快速測試、小型或舊專案 長期維護、企業級系統

以我這次案例來說,kgeip 就是一個 Web Site 專案,因此即使在 .sln 中加入 ProjectReferences,也不會自動將 DLL 複製進 kgeip\bin

如果你的專案是長期維護型、需要可控建置流程,建議考慮轉成 Web Application 專案,能大幅降低部署踩雷機率。


🧪 修復流程與試誤紀錄

✅ 成功解法總結如下:

  1. 將 DLL 專案(如 Portal)從「DLL 引用」改為「專案參考」
  2. 清除方案 → 建置方案
  3. 編譯產出後,手動複製 DLLkgeip\bin
  4. 網站更新成功 🎉

🤖 我後來進一步優化:用 .bat 腳本一鍵完成

為了不再每次改完 DLL 後還要手動點 Visual Studio,我決定自己寫一份 .bat 腳本來處理整個建置與同步流程。

一開始,我寫了這樣的基本版本:

@echo off
setlocal
cd /d %~dp0..
msbuild kgeip.sln /t:Clean;Build /p:Configuration=Release
xcopy /Y EDAPortal\bin\Release\EDAPortal.dll kgeip\bin\
xcopy /Y EDAComponent\bin\Release\EDAComponent.dll kgeip\bin\
echo ✅ Done!
pause

這樣做的好處是:

  • 可以在命令列或 Windows 排程中自動執行
  • 不需開啟 Visual Studio,就能建置 DLL 並放進網站 bin 資料夾

但我遇到一個問題:不是每台機器都有把 msbuild.exe 加到環境變數中,有時會出現「找不到指令」的錯誤。

所以我進一步優化這支腳本,加上自動偵測 msbuild.exe 路徑的邏輯,變成這樣:

@echo off
setlocal ENABLEEXTENSIONS
set "MSBUILD_PATH="

echo 嘗試自動尋找 msbuild.exe...

:: 遍歷常見安裝位置
for %%A in (
    "C:\Program Files\Microsoft Visual Studio\2022\BuildTools\MSBuild\Current\Bin\MSBuild.exe"
    "C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe"
    "C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin\MSBuild.exe"
    "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\MSBuild.exe"
    "C:\Program Files\Microsoft Visual Studio\2022\Professional\MSBuild\Current\Bin\MSBuild.exe"
) do (
    if exist %%~A (
        set "MSBUILD_PATH=%%~A"
        goto :found
    )
)

:found
if not defined MSBUILD_PATH (
    echo 找不到 msbuild.exe,請確認是否已安裝 Visual Studio Build Tools。
    pause
    exit /b 1
)

echo 使用 msbuild.exe: %MSBUILD_PATH%
cd /d %~dp0..
"%MSBUILD_PATH%" kgeip.sln /t:Clean;Build /p:Configuration=Release

echo 複製 DLL 到網站 bin...
xcopy /Y EDAComponent\bin\Release\EDAComponent.dll kgeip\bin\
xcopy /Y EDAPortal\bin\Release\EDAPortal.dll kgeip\bin\

echo 完成:建置並複製 DLL 至網站 bin\
pause

這段腳本的亮點在於:

特性 說明
✅ 自動搜尋 不依賴環境變數,會在常見 VS 安裝路徑中自動找出 msbuild.exe
✅ 相容性高 支援 VS 2019 與 2022(BuildTools、Community、Professional 版本)
✅ 執行穩定 找不到會明確顯示錯誤,避免默默失敗

這支腳本現在成為我本地專案的必備工具,每次只要雙擊執行,就能把所有 DLL 最新編譯並同步到網站專案,部署乾淨又安心。


🧰 最後我完成了這些部署策略

✅ 開發機透過 build.bat 一鍵清除+建置+複製
✅ 正式機只接收打包好的 kgeip\bin + .aspx + 靜態資源
✅ 沒推任何 DLL 上 Git,只保留原始碼與 .sln
✅ 不需手動進 Visual Studio,部署流程變得乾淨又安心


🧪 適合詢問 GPT 的 prompt

若你遇到 DLL 沒更新的問題,可詢問:

  • 修改了 class library,但 WebForm 網站仍執行舊 DLL,可能原因是什麼?
  • 如何讓 Web Site 專案也能自動同步 DLL?
  • 不用 Visual Studio,怎麼用 msbuild 建置 .sln 並同步到 bin 資料夾?

圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言